"""
你可以定义一个由自己想要功能的函数，以下是简单的规则：

函数代码块以 def 关键词开头，后接函数标识符名称和圆括号 ()。
任何传入参数和自变量必须放在圆括号中间，圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号 : 起始，并且缩进。
return [表达式] 结束函数，选择性地返回一个值给调用方，不带表达式的 return 相当于返回 None。
"""

# 语法
"""
def 函数名（参数列表）:
    函数体

"""


def hello():
    print('hello')


hello()  # 输出 hello


# 不可变参数
def change(a):
    print(id(a))  # 指向的是同一个对象
    a = 10
    print(id(a))  # 一个新对象


a = 1
print(id(a))
change(a)

# 可变参数
print("\n======可变参数======\n")


# 可写函数说明
def changeme(mylist):
    "修改传入的列表"
    mylist.append([1, 2, 3, 4])
    print("函数内取值: ", mylist)
    return


# 调用changeme函数
mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: ", mylist)

print("\n======不定长参数======\n")


# !/usr/bin/python3

# 可写函数说明 *vartuple 是元组
def printinfo(arg1, *vartuple):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    for var in vartuple:
        print(f"var:{var}")


# 调用printinfo 函数
printinfo(70, 60, 50)

print("\n======不定长参数：字典======\n")


# 可写函数说明
def printinfo(arg1, **vardict):
    "打印任何传入的参数"
    print("输出: ")
    print(arg1)
    for key, value in vardict.items():
        print(f"{key}:{value}")


# 调用printinfo 函数
printinfo(1, a=2, b=3)

print("\n======默认参数======\n")


# 可写函数说明：函数中一旦有默认参数，那么，后面所有的参数都必须有默认参数，否则会报错。而且，默认参数必须指向不变对象！
def printinfo(name, age=35,city="beijing"):
    "打印任何传入的字符串"
    print("名字: ", name)
    print("年龄: ", age)
    return


# 调用printinfo函数
printinfo(age=50, name="runoob")
print("------------------------")
printinfo(name="runoob")
print("------------------")
printinfo("xurongebei", age=50)
